package taskmanager;

import java.util.Iterator;
import java.util.Vector;
import taskmanager.exception.*;

/**
 * Интерфейс планировщика задач.
 * @author TrueWar
 * @see JTaskManager
 * @deprecated теперь используется ITaskManager
 */
public interface IJTaskManager
{
    //--------------------Интерфейсные методы----------------------------------
    /**
     * Запросить количество задач в очереди
     * @return размер очереди
     */
    public int getTaskQueueSize();
    /**
     * Запросить вектор активных задач
     * @return вектор активных задач
     */

   public Vector<JTask> getActiveTasks();
    /**
     * Проверить наличие хотя бы одной активной задачи
     * @return true - есть активная, false - нет активной задачи
     */
    public boolean hasActiveTask();

    /**
     * Получить текущее количество выполняемых задач
     * @return количество выполняемых задач
    */
    public int getCountActiveTask();

    /**
     * проверить наличие задач в очереди
     * @return true если задач нет, иначе false
     */
    public boolean isQueueEmpty();

    /**
     * Проверить наличие задач выполнение которых было приостановлено
     * @return true - задачи отсутствуют, false - задачи есть
     */
    public boolean isStopTaskQueueEmpty();

    /**
     * Получить количество остановленных задач
     * @return количество остановленных задач
     */
    public int getCountStopTask();

    /**
     * Получить список остановленных задач
     * @return список остановленных задач
     */
    public Vector<JTask> getStopTasks();

    /**
     * Проверить наличие задач в очереди восстановленных задач
     * @return в очереди имеются задачи
     */
    public boolean hasResumeTasks();

    /**
     * Получить количество восстановленных задач
     * @return количество восстановленных задач
     */
    public int getCountResumeTasks();

    /**
     * Получить список восстановленных задач
     * @return
     */
    public Vector<JTask> getResumeTasks();
     /**
     * Получить максимальное количество активных задач
     * @return максимальное количество активных задач
     */
    public int getMaxActiveTasks();

    /**
     * Установить максимальное количество активных задач
     * @param maxCountActiveTasks - максимальное количество активных задач
     * @return true - установка нового значения выполнилось успешно, false - максимальное количество активных задач не может быть меньше 1
     */
    public boolean setMaxActiveTasks(int maxCountActiveTasks);

    /**
     * добавить задачу в систему
     * в случае, еси включена автоподача задач, очередная задача пойдет на
     * исполнение
     * @param newTask новая задача
     * @return true в случае успеха, false если задача уже добавлена
     */
    public boolean addTask(JTask newTask);

    /**
     * Сделать следующую задачу активной
     * @return  true в случае успеха, false - очередь пуста
     * @throws taskmanager.exception.HasActiveTaskException если достигнут лимит одновременно выполняющихся задач
     */
    public boolean activeNextTask() throws HasActiveTaskException;

    /**
     * Остановить активную задачу
     * Активная задача возвращается в очередь и если включена автопоача
     * задач выполняется очередная задача.
     * @return true в случае успеха, false - нет активной задачи
     */
    public boolean stopActiveTask(JTask task);

    /**
     * Запустить активную задачу в случае её приостановки
     * @return true в случае успеха, false - нет активной задачи
     */
    public boolean resumeTask(JTask task);

    /**
     * Проверить останов системы
     * @return true - система остановлена, иначе false
     */
    public boolean isSystemStoped();

    /**
     * Остановить систему
     * Если есть активная заача она приостанавливается, но не возвращается в
     * очередь
     */
    public void stopSystem();

    /**
     * Запустить систему
     * Если включена автоподача  - пытается запустить задачи из очереди
    */
    public void runSystem();

    /**
     * Установить автоматическую подачу задач
     * @param flag признак автоматической подачи
     */
    public void setAutoTaskServe(boolean flag);

    /**
     * Запросить признак автоподачи задач
     * @return признак автоподачи задач
     */
    public boolean getAutoTaskServe();
    /** Очистить очередь задач */
    public void clearQueue();
    /**
     * Очистить все задачи в системе.
     * Если есть активная задача - она останавливается и удаляется
     */
    public void clearAll();
    /**
     * Запросить итератор очереди задач
     * @return итератор
     */
    public Iterator<JTask> getTaskQueueIterator();

    /**
     * Удалить задачу из системы.
     * Если задача активна, выполнение прекращается и заача удаляется,
     * если удалена активная задача и включена автоподача - пытается выполнить
     * очередную задачу
     * @param task задача
     * @return true в случае успеха, false - задачи нет в системе
     */
    public boolean deleteTask(JTask task);

    /**
     * Проверить наличие задачи в системе
     * @param task задача
     * @return true если задача присутствует в системе
     */
    public boolean containsTask(JTask task);
}
